<!--
 * 调研工作安排 - 基本信息
-->
<script>
import { CommonBusinessForm } from 'jdf-common-biz';
import ResearchWorkArrangementService from '@/api/domains/researchWorkArrangement/ResearchWorkArrangementService';
import ArrangementForm from '@/views/procecss-form/components/arrangement/ArrangementForm';
import {
  VISITED_PEOPLE_TIP,
  DICT_TYPE,
  RESEARCH_GROUP_VISITED_PEOPLE,
  PERSONAL_ORGANIZATIONAL_FIELDS_MAPPING,
  DEFAULT_DATE_FORMAT,
  SET_DEPT_IDS,
  DEFAULT_ARRAY_VALUE,
  WORK_ARRANGEMENT_SOURCE_LIST,
  OVER_PEOPLE_LIMIT_COMMON_MESSAGE,
  CAN_EDIT,
  CANNOT_EDIT,
  PROVINCE_CODE,
  NON_DISTRICT_COMPANY_CODE,
} from '@/utils/constants';
import { messageTipConfirm, validateMessage } from '@/api/utils/pc-message';
import commonMixins from '@/mixins/commonMixins';
import {
  get, isEmpty, map, chain,
} from 'lodash-es';
import { joinTypeField, validateWordCount, changeDateRangeValue } from '@/utils/utils';
import { getStorageInfo } from '@/api/utils/storage-util';

// 获取字典类型
const { RESEARCH_TYPE, RESEARCH_LEVEL, RESEARCH_FORM, JCHY_DOMAIN_TYPE } = DICT_TYPE;
// 获取调研组陪同人员人数
const {
  PROVINCE_VISITED_PEOPLE,
  PROVINCE_OTHER_VISITED_PEOPLE,
  PROVINCE_VALUE_POSITION_VISITED_PEOPLE,
  DEFAULT_VISITED_PEOPLE
} = RESEARCH_GROUP_VISITED_PEOPLE;
// 获取来源
const { NEW_DRAFT, PROCESS_DRAFT } = WORK_ARRANGEMENT_SOURCE_LIST;

export default {
  extends: CommonBusinessForm,
  components: { ArrangementForm },
  mixins: [commonMixins],
  data() {
    return {
      // 后台服务
      service: new ResearchWorkArrangementService(),
      // 需要进行主抄送重复校验的字段
      needSendDuplicateCheckFields: [],
      // 自定义校验规则
      baseRules: {},
      normativeTypeOptions: [],
      // 表单字段布局配置
      formConfigs: [
        [
          {
            formElCode: 'leadingUserName', // 带队领导
            colSpan: 8,
            elType: 'personOrOrg',
            visibleField: 'groupIdentityTreeVisible',
            treeAttrs: {
              identityId: this.currIdentity.id,
              groupCode: 'DY_TJZ_COMPANY_LEADER',
              dialogTitle: '选择带队领导',
            },
            attrs: {
              placeholder: '请选择',
            },
          },
          {
            formElCode: 'researchDate', // 调研起止日期
            colSpan: 8,
            elType: 'DatePicker',
            formatter: (row) => row,
            attrs: {
              placeholder: '请选择调研起止日期',
              type: 'daterange',
              'range-separator': '至',
              'start-placeholder': '开始日期',
              'end-placeholder': '结束日期',
              format: DEFAULT_DATE_FORMAT,
              valueFormat: DEFAULT_DATE_FORMAT,
            },
            event: {
              change: this.researchDateChange
            }
          },
          {
            formElCode: 'leadingDepartmentName', // 牵头部门
            colSpan: 8,
            elType: 'personOrOrg',
            visibleField: 'groupOrgTreeVisible',
            treeAttrs: {
              identityId: this.currIdentity.id,
              groupCode: 'DY_HOT_DEPT',
              filterable: true, // 是否可搜索，默认false
              dialogTitle: '选择牵头部门',
            },
            attrs: {
              placeholder: '请选择',
            },
          },
        ],
        [
          {
            formElCode: 'researchUnitName', // 调研对象
            colSpan: 8,
            elType: 'personOrOrg',
            visibleField: 'groupOrgTreeVisible',
            treeAttrs: {
              identityId: this.currIdentity.id,
              groupCode: 'DY_COMPANIES_FORM',
              dialogTitle: '选择调研对象',
              expandAll: true
            },
            attrs: {
              placeholder: '请选择',
            }
          },
          {
            formElCode: 'grassrootsContactName', // 调研区县
            colSpan: 8,
            elType: 'dialogTable',
            visibleField: 'dialogTableVisible',
            dialogTableAttrs: {
              dialogTitle: '选择区县',
              dialogTableColumns: [
                { type: 'selection', attrs: { 'reserve-selection': true } },
                { label: '区县', prop: 'grassrootsContactName', attrs: { 'show-overflow-tooltip': true } }
              ],
              // 当前行的唯一标识
              selectKey: 'id',
              multipleSelect: false,
              tableAttrs: { border: true },
              formatParam: {
                'format-list': 'records',
                'format-total': 'total',
                'format-number': 'pageNum',
                'format-size': 'size',
              },
              dialogTablePaginationAttrs: {
                'current-page': 1,
                'page-size': 10,
                layout: 'prev, sizes, pager, next, jumper, total',
                total: 0,
                background: true,
                'page-sizes': [10, 20, 30]
              },
              searchMethod: (val) => this.getDistrictCounty({ ...val, companyName: this.formData.researchUnitName }),
              // 输入框要展示的名称
              showNameField: 'grassrootsContactName'
            }
          },
          {
            formElCode: 'researchMethod', // 乡镇/网格
            colSpan: 8,
            attrs: {
              placeholder: '请输入',
            }
          },
        ],
        [
          {
            formElCode: 'researchType', // 调研类型
            colSpan: 8,
            elType: 'select',
            isDict: RESEARCH_TYPE,
            attrs: {
              placeholder: '请选择'
            },
          },
          {
            formElCode: 'researchLevel', // 调研层级
            colSpan: 8,
            elType: 'select',
            isDict: RESEARCH_LEVEL,
            attrs: {
              placeholder: '请选择'
            },
          },
          {
            formElCode: 'researchForm', // 调研形式
            colSpan: 8,
            elType: 'select',
            isDict: RESEARCH_FORM,
            attrs: {
              placeholder: '请选择'
            },
          },
        ],
        [
          {
            formElCode: 'normativeActions', // 连带性规范性动作类型
            colSpan: 16,
            elType: 'select',
            formatter: (row) => this.formData.normativeType || row,
            options: () => this.normativeParamList,
            attrs: {
              placeholder: '请选择',
              multiple: true,
            },
            event: {
              // 获取焦点时触发
              focus: this.typeFocus,
              // 选中值发生变化时触发
              change: this.typeChange,
            }
          },
          {
            formElCode: 'researchSubject', // 调研主题
            colSpan: 16,
            attrs: {
              placeholder: '关于xxxxxxx的调研',
            }
          },
        ],
        [
          {
            formElCode: 'researchContactName', // 调研组联络人
            colSpan: 16,
            elType: 'personOrOrg',
            visibleField: 'groupIdentityTreeVisible',
            treeAttrs: {
              groupCode: 'DY_COMPANY_ALL_PERSONNEL',
              filterable: true, // 是否可搜索，默认false
              dialogTitle: '选择调研组联络人',
            },
            attrs: {
              placeholder: '请选择',
            },
          },
          {
            formElCode: 'researchEntourageName', // 调研组陪同人员
            colSpan: 16,
            elType: 'personOrOrg',
            visibleField: 'groupIdentityTreeVisible',
            treeAttrs: {
              groupCode: 'DY_COMPANY_ALL_PERSONNEL',
              multiple: true,
              filterable: true, // 是否可搜索，默认false
              dialogTitle: '选择调研组陪同人员',
            },
            attrs: {
              placeholder: '请选择',
            }
          },
        ],
        [
          {
            formElCode: 'conductResearchContactName', // 被调研单位联络人
            colSpan: 16,
            elType: 'personOrOrg',
            visibleField: 'groupIdentityTreeVisible',
            treeAttrs: {
              groupCode: 'DY_COMPANY_ALL_PERSONNEL',
              filterable: true, // 是否可搜索，默认false
              dialogTitle: '选择被调研单位联络人',
            },
            attrs: {
              placeholder: '请选择市公司三级经理',
            },
          },
          {
            formElCode: 'conductResearchEntourageName', // 被调研单位陪同人员
            colSpan: 16,
            elType: 'personOrOrg',
            visibleField: 'groupIdentityTreeVisible',
            labelTip: VISITED_PEOPLE_TIP,
            treeAttrs: {
              groupCode: 'DY_COMPANY_ALL_PERSONNEL',
              multiple: true,
              filterable: true, // 是否可搜索，默认false
              dialogTitle: '选择被调研单位陪同人员',
            },
            attrs: {
              placeholder: '请选择',
            },
          },
        ],
        [
          {
            // 主要行程/调研报告/调研须知
            formElCode: 'arrangementForm',
            colSpan: 24,
            hideLabel: true,
            defineClassName: 'arrangementForm',
            render: (h) => h(ArrangementForm, {
              ref: 'arrangementFormRef',
              props: {
                piid: this.piid, // 流程实例id
                isDone: this.isDone, // 是否完成
                nodeId: this.nodeId, // 节点id
                fieldIsEdit: this.fieldIsEdit, // 判断字段field是否可编辑，参数为字段的code，返回值为boolean
                formData: this.formData, // 表单数据
              },
              on: {
                'change-v': this.setOpinionContent,
              },
            }),
          },
        ],
      ],
      // 主抄送是否获取网关数据, false为不获取，true为获取
      isGateWayData: false,
      // 采用ucfg的数据字典，不采用数据库表中字典值
      isSelfDict: false,
      // 调研陪同人数配置
      researchPersonnelConfig: {
        // 公司领导 最多为5人
        'GS-Z': PROVINCE_VISITED_PEOPLE,
        // 公司副职领导 最多为3人
        'GS-F': PROVINCE_OTHER_VISITED_PEOPLE
      },
      // 被调研陪同人数配置
      conductResearchPersonnelConfig: {
        // 公司领导 最多为2人
        'GS-Z': PROVINCE_VALUE_POSITION_VISITED_PEOPLE,
        // 公司副职领导 最多为1人
        'GS-F': DEFAULT_VISITED_PEOPLE
      },
      // 省公司编号列表
      provinceCompanyCodeList: [PROVINCE_CODE, NON_DISTRICT_COMPANY_CODE],
    };
  },
  watch: {
    'formData.title': {
      handler(val) {
        this.$emit('update:processTitle', val);
      },
    },

    // 调研起止日期变化时触发 通过开始年份获取规范性动作类型
    'formData.researchStartDate': {
      handler(val) {
        val && this.getNormativeParams();
      },
      deep: true,
    },

    /**
     * 表单数据变化时触发
     */
    formData: {
      handler(val) {
        // 获取表单编号
        this.$emit('changeBizFormData', val);
      },
      deep: true,
    }
  },

  mounted() {
    this.validateBasicInfo();
  },

  methods: {
    /**
     * 填写基本信息提示
     */
    validateBasicInfo() {
      // 调研组联络人填写表单前需进行弹窗确认，确认调研安排信息是否正确显示。
      this.nodeId === 'contactReport' && messageTipConfirm('请填写调研基础信息及主要行程！');
    },

    /**
     * 表单数据初始化后调用的方法
     * */
    afterInit(formData) {
      this.$emit('update:documentFormTitle', formData.title || '调研工作安排');

      // 当前登录人是否为省公司
      const isProvince = getStorageInfo('region') === PROVINCE_CODE;
      // 调研组陪同人员 占位符根据是否为省公司展示不同提示
      this.modifyFormConfig('researchEntourageName', 'attrs', { placeholder: isProvince ? '请选择省公司二级经理' : '请选择市公司三级经理' });
      // 被调研单位陪同人员 占位符根据是否为省公司展示不同提示
      this.modifyFormConfig('conductResearchEntourageName', 'attrs', { placeholder: isProvince ? '请选择市公司三级经理' : '请选择市公司四级经理' });
      // 被调研单位联络人 占位符根据是否为省公司展示不同提示
      this.modifyFormConfig('conductResearchContactName', 'attrs', { placeholder: isProvince ? '请选择市公司三级经理' : '请选择区县公司部门主管' });
    },

    /**
     * 联动选择框聚焦事件
     * @param pickerIns {Object} 选择器实例
     */
    typeFocus(pickerIns) {
      if (!isEmpty(this.formData.researchDateRange)) {
        return;
      }
      // 如果没有选择调研起止日期 则提示并关闭选择器
      validateMessage('请先选择调研起止日期！');
      this.$set(pickerIns, 'pickerVisible', false);
    },

    /**
     * 连带性规范动作类型变化事件
     * @param value {String} 选中的值
     * @param data {Object} 选中的数据
     * @param $set {Function} 设置表单数据方法
     */
    typeChange(value, data, $set) {
      joinTypeField(this.normativeParamList, value, $set);
    },

    /**
     * 调研起止日期变化事件
     * @param value {Array} 选中的日期
     * @param data {Object} 数据表单
     * @param $set {Function} 设置表单数据方法
     */
    researchDateChange(value, data, $set) {
      changeDateRangeValue(value, $set, {
        startField: 'researchStartDate',
        endField: 'researchEndDate',
        rangeDate: 'researchDate',
      });
      $set('researchDateRange', value);
    },

    /**
     * 自定义选人或者选部门后的方法 (组件框架自带的方法 只有此方法才能获取选择后的数据)
     * @param data {Array} 选中的数据
     * @param clickField {String} 点击的字段code
     */
    extendSelectIdOrOrg(data, clickField) {
      // 选择带队领导时 获取职位身份
      if(clickField === 'leadingUserName') {
        // 单选 默认从第一个里面获取当前人员的职位身份
        this.formData.identityDefCode = data[DEFAULT_ARRAY_VALUE].userIdentityObj.identityDefCode;
      }
      this.getIdOrOrg(clickField, data);
    },

    /**
     * 点击按钮弹出表格框后的点击确定事件
     * @param params {Object} 选中的数据参数
     */
    extendSelectedTableData(params) {
      const { clickField, datas } = params;
      // 调研区县选择方式不同 单独处理
      if (clickField === 'grassrootsContactName') {
        // 调研区县单选 取第一条即可
        this.bizSet({ grassrootsContactId: datas[0].id });
        return;
      }
      this.getIdOrOrg(clickField, datas);
    },

    /**
     * 选择人员或者部门时重新获取对应的id
     * @param clickField {String} 点击的字段code
     * @param data {Array} 选中的数据列表
     */
    getIdOrOrg(clickField, data) {
      // 获取目标字段
      const targetField = PERSONAL_ORGANIZATIONAL_FIELDS_MAPPING[clickField];
      if (!targetField) {
        return;
      }
      //  选组织时存组织id
      const getIds = () => map(data, 'id').join(',');
      // 选人时存登录名
      const getLoginNames = () => map(data, (item) => get(item, 'userIdentityObj.loginName')).join(',');
      // 根据字段类型赋值
      this.formData[targetField] = SET_DEPT_IDS.includes(targetField) ? getIds() : getLoginNames();
    },

    /**
     * 保存子组件的意见内容
     * @param val
     */
    setOpinionContent(val) {
      const { indicatedProblem, require, whetherAnswer } = val;
      // 把主要行程/调研报告/调研须知 的数据添加到 表单数据中
      this.bizSet({
        ...val,
        // 调研报告
        researchReport: { indicatedProblem, require },
        // 调研须知
        researchGuidelines: { whetherAnswer }
      });
    },

    /**
     * 默认提交参数
     */
    defaultSubmitParams() {
      const { bizSet, formData: { source } } = this;
      bizSet({
        source: source || NEW_DRAFT, // 来源
      })
    },

    /**
     * 点击保存按钮后，执行内置保存校验后，数据保存前的事件，通过throw new Error 或 return Promise.reject()阻止事件继续执行
     * 如果要执行的操作是异步的并需要等待，需return 异步方法或者await 异步方法，来实现等待
     */
    beforeSaveBusinessForm(attachmentList) {
      this.defaultSubmitParams();
      this.defaultContactCandidate();
    },

    /**
     * 联络人办理默认候选人
     */
    defaultContactCandidate() {
      if (this.nodeId !== 'comprehensiveAdminAssign') {
        return;
      }
      // 综合部调研派发环节默认候选人为调研人跟被调研人
      const { conductResearchContactNameIds = '', researchContactNameIds = '' } = this.formData;
      const reassignTaskIds = chain([
        conductResearchContactNameIds.split(','),
        researchContactNameIds.split(','),
      ])
        .flatten() // 合并数组
        .compact() // 过滤空值
        .uniq() // 去重
        .join(',')// 转字符串
        .value();
      // 设置候选人
      this.bizSet({ reassignTaskIds });
    },

    /**
     * 点击提交按钮后并执行表单校验后，提交窗口打开前的事件，通过throw new Error 或 return Promise.reject()阻止事件继续执行
     * 如果要执行的操作是异步的并需要等待，需return 异步方法或者await 异步方法，来实现等待
     */
    async customBeforeClickSubmitBtn(extendCollaspeRefs) {
      const { researchPersonnelConfig, conductResearchPersonnelConfig, formData, fieldIsEdit, nodeId } = this;
      const {
        identityDefCode,
        researchEntourageNameSelected,
        conductResearchEntourageNameSelected,
        mainItineraries,
        indicatedProblem,
        require,
        whetherAnswer,
        promiseId,
        conductResearchContactId,
        researchContactId
      } = formData;

      // 对'调研组陪同人员'限制 如果超出选人限制 则提示
      if(researchEntourageNameSelected?.length > researchPersonnelConfig[identityDefCode]) {
        validateMessage(`调研组${OVER_PEOPLE_LIMIT_COMMON_MESSAGE}`);
        throw new Error();
      }

      // 对'被调研单位陪同人员'限制 如果超出选人限制 则提示
      if(conductResearchEntourageNameSelected?.length > conductResearchPersonnelConfig[identityDefCode]) {
        validateMessage(`被调研单位${OVER_PEOPLE_LIMIT_COMMON_MESSAGE}`);
        throw new Error();
      }

      // 主要行程设置必填时 在进行验证
      if(fieldIsEdit('mainItineraries') && isEmpty(mainItineraries)) {
        validateMessage('请添加主要行程！');
        throw new Error();
      }

      const { arrangementFormRef } = this.$refs.increaseForm.$refs;

      // 获取登录人Id
      const getLoginId = getStorageInfo('loginName');
      // 联络人办理环节
      const isReassignTask = nodeId === 'reassignTask';

      // 当前环节在'联络人办理' 并且 登录人是'调研组联络人' 则效验调研报告
      if(isReassignTask && researchContactId === getLoginId) {
        // 对调研报告进行验证
        await arrangementFormRef.$refs.researchReportRef.validateBusinessForm();
        // 指出的问题、要求至少填写50个字限制
        if(!indicatedProblem || !require || validateWordCount(indicatedProblem, 50) || validateWordCount(require)) {
          throw new Error();
        }
      }

      // 对调研须知进行验证
      if(fieldIsEdit('researchGuidelines') && !whetherAnswer) {
        validateMessage('请查看调研须知并开始答题！');
        throw new Error();
      }

      // 当前环节在'联络人办理' 并且 登录人是'被调研单位联络人' 并且没有点击承诺 则打开承诺弹窗
      if(isReassignTask && conductResearchContactId === getLoginId && !promiseId) {
        arrangementFormRef.confirmPromise();
        throw new Error();
      }
    }
  },
};
</script>
<style lang="scss" scoped>
// 去掉子组件边距
::v-deep .arrangementForm-col > .arrangementForm > .el-form-item__content {
  padding: 0 !important;
}
</style>
